//
// Created by ASUS on 2024/12/12/星期四.
//
#include <iostream>
#include <cstring>
#include <algorithm>
#include <deque>
using namespace std;

const int N = 2010;

int n, m;
int v[N], w[N], s[N];  // v表示体积，w表示价值，s表示数量
int f[N];

int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) cin >> v[i] >> w[i] >> s[i];

	for (int i = 1; i <= n; ++i) {
		// 分组，对于第i种物品，按照余数分组
		for (int r = 0; r < v[i]; ++r) {
			deque<int> q;
			// 遍历所有可能的“阶段”，每个阶段相当于考虑不同容量的背包
			for (int j = r; j <= m; j += v[i]) {
				// 计算当前物品取了多少个
				int val = f[j] - (j-r) / v[i] * w[i];
				// 维护单调队列，保证队首元素是最优决策
				while (!q.empty() && j - q.front() > s[i] * v[i]) q.pop_front();
				while (!q.empty() && val >= f[q.back()] - (q.back()-r) / v[i] * w[i]) q.pop_back();
				q.push_back(j);
				f[j] = f[q.front()] + (j - q.front()) / v[i] * w[i];
			}
		}
	}

	cout << f[m] << endl;
	return 0;
}